Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Distributed object communication</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Distributed_object_communication"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Distributed_object_communication rootpage-Distributed_object_communication skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Distributed object communication</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p>In a distributed computing environment, <b>distributed object communication</b> realizes communication between distributed objects. The main role is to allow objects to access data and invoke methods on remote objects (objects residing in non-local memory space). Invoking a method on a remote object is known as <b>remote method invocation</b> (<b>RMI</b>) or <b>remote invocation</b>, and is the object-oriented programming analog of a remote procedure call (RPC).
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Class_stubs_and_skeletons">Class stubs and skeletons</h2></div>
<p>The widely used approach on how to implement the communication channel is realized by using <a href="Class_stub" class="mw-redirect" title="Class stub">stubs</a> and <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeletons</a>. They are generated objects whose structure and behavior depends on chosen communication protocol, but in general provide additional functionality that ensures reliable communication over the network.
</p><p>In RMI, a stub (which is the bit on the client) is defined by the programmer as an <a href="Interface_(object-oriented_programming)" title="Interface (object-oriented programming)">interface</a>. The rmic (rmi compiler) uses this to create the class stub. The stub performs type checking. The skeleton is defined in a class which <a href="Implements_(Java)" class="mw-redirect" title="Implements (Java)">implements</a> the interface stub.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>When a caller wants to perform remote call on the called object, it delegates requests to its <a href="Class_stub" class="mw-redirect" title="Class stub">stub</a> which initiates communication with the remote <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeleton</a>. Consequently, the stub passes caller arguments over the network to the server skeleton. The skeleton then passes received data to the called object, waits for a response and returns the result to the client stub. Note that there is no direct communication between the caller and the called object.
</p><p>In more details, the communication consists of several steps:
</p>
<ol><li>caller calls a local <a href="Subroutine" class="mw-redirect" title="Subroutine">procedure</a> implemented by the stub</li>
<li>stub <a href="Marshalling_(computer_science)" title="Marshalling (computer science)">marshalls</a> call type and the input arguments into a request message</li>
<li>client stub sends the message over the network to the server and blocks the current execution <a href="Thread_(computer_science)" class="mw-redirect" title="Thread (computer science)">thread</a></li>
<li>server skeleton receives the request message from the network</li>
<li>skeleton unpacks call type from the request message and looks up the <a href="Subroutine" class="mw-redirect" title="Subroutine">procedure</a> on the called object</li>
<li>skeleton <a href="Marshalling_(computer_science)" title="Marshalling (computer science)">unmarshalls</a> procedure arguments</li>
<li>skeleton executes the <a href="Subroutine" class="mw-redirect" title="Subroutine">procedure</a> on the called object</li>
<li>called object performs a computation and returns the result</li>
<li>skeleton packs the output arguments into a response message</li>
<li>skeleton sends the message over the network back to the client</li>
<li>client stub receives the response message from the network</li>
<li>stub unpacks output arguments from the message</li>
<li>stub passes output arguments to the caller, releases execution <a href="Thread_(computer_science)" class="mw-redirect" title="Thread (computer science)">thread</a> and caller then continues in execution</li></ol>
<p>The advantage of this architecture is that neither the caller nor the called object has to implement network related logic. This functionality, that ensures reliable communication channel over the network, has been moved to the <a href="Class_stub" class="mw-redirect" title="Class stub">stub</a> and the <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeleton</a> layer.
</p>
<div class="mw-heading mw-heading2"><h2 id="Stub">Stub</h2></div>
<p>The client side object participating in distributed object communication is known as a <b>stub</b> or <b>proxy</b>, and is an example of a <a href="Proxy_object" class="mw-redirect" title="Proxy object">proxy object</a>.
</p><p>The stub acts as a gateway for client side objects and all outgoing requests to server side objects that are routed through it. The stub wraps client object functionality and by adding the network logic ensures the reliable communication channel between client and server. The stub can be written up manually or generated automatically depending on chosen communication protocol.
</p><p>The stub is responsible for:
</p>
<ul><li>initiating the communication towards the server <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeleton</a></li>
<li>translating calls from the caller object</li>
<li><a href="Marshalling_(computer_science)" title="Marshalling (computer science)">marshalling</a> of the parameters</li>
<li>informing the <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeleton</a> that the call should be invoked</li>
<li>passing arguments to the <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeleton</a> over the network</li>
<li><a href="Serialization" title="Serialization">unmarshalling</a> of the response from the <a href="Class_skeleton" class="mw-redirect" title="Class skeleton">skeleton</a></li>
<li>informing the caller that the call is complete</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Skeleton">Skeleton</h2></div>
<p>The server side object participating in distributed object communication is known as a <b>skeleton</b> (or stub; term avoided here).
</p><p>A skeleton acts as gateway for server side objects and all incoming clients requests are routed through it. The skeleton
wraps server object functionality and exposes it to the clients, moreover by adding the network logic ensures the reliable communication channel between clients and server. Skeletons can be written up manually or generated automatically depending on chosen communication protocol.
</p><p>The skeleton is responsible for:
</p>
<ul><li>translating incoming data from the <a href="Class_stub" class="mw-redirect" title="Class stub">stub</a> to the correct up-calls to server objects</li>
<li><a href="Serialization" title="Serialization">unmarshalling</a> of the arguments from received data</li>
<li>passing arguments to server objects</li>
<li><a href="Marshalling_(computer_science)" title="Marshalling (computer science)">marshalling</a> of the returned values from server objects</li>
<li>passing values back to the client <a href="Class_stub" class="mw-redirect" title="Class stub">stub</a> over the network</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Protocols_using_stub/skeleton_approach">Protocols using stub/skeleton approach</h2></div>
<ul><li><a href="Portable_Distributed_Objects" title="Portable Distributed Objects">Portable Distributed Objects</a> (PDO) - <a href="Objective-C" title="Objective-C">Objective-C</a></li>
<li><a href="Common_Object_Request_Broker_Architecture" title="Common Object Request Broker Architecture">Common Object Request Broker Architecture</a> (CORBA) – inter-language</li>
<li><a href="Java_remote_method_invocation" title="Java remote method invocation">Java remote method invocation</a> (Java RMI) – Java</li>
<li><a href="Distributed_Component_Object_Model" title="Distributed Component Object Model">Distributed Component Object Model</a> (DCOM) – Microsoft, inter-language
<dl><dd>(note that the stub is called "proxy" and the skeleton is called "stub"<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>)</dd></dl></li>
<li><a href=".NET_Remoting" title=".NET Remoting">.NET Remoting</a> – Microsoft, inter-language</li>
<li><a href="DDObjects" title="DDObjects">DDObjects</a> – <a href="Borland_Delphi" class="mw-redirect" title="Borland Delphi">Borland Delphi</a></li>
<li>Distributed Ruby (DRb) – <a href="Ruby_programming_language" class="mw-redirect" title="Ruby programming language">Ruby</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Object_request_broker" title="Object request broker">Object request broker</a></li>
<li><a href="Distributed_object" title="Distributed object">Distributed object</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20020326062030/http://www-itec.uni-klu.ac.at/~harald/ds2001/rmi/rmi.html">"Introduction to Java Remote Method Invocation (RMI)"</a>. <i>www-itec.uni-klu.ac.at</i>. Archived from <a rel="nofollow" class="external text" href="http://www-itec.uni-klu.ac.at/~harald/ds2001/rmi/rmi.html">the original</a> on 2002-03-26.</cite> </span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/en-us/library/ms692621%28VS.85%29.aspx">MSDN: Marshalling details.</a></span>
</li>
</ol></div></div>
<ul><li>Plášil, František and Stal, Michael. <a rel="nofollow" class="external text" href="http://dsrg.mff.cuni.cz/publications/FPLUSOBR.pdf">"An Architectural View of Distributed Objects and Components in CORBA, Java RMI, and COM/DCOM"</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20070624082719/http://dsrg.mff.cuni.cz/publications/FPLUSOBR.pdf">Archived</a> 2007-06-24 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>, <i>Software Concepts &amp; Tools (vol. 19, no. 1)</i>, January, 1998.</li>
<li>Druschel, Peter <a rel="nofollow" class="external text" href="http://www.cs.rice.edu/~druschel/comp413/lectures/rmi-corba.html">"Distributed Program Construction"</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20160304054111/http://www.cs.rice.edu/~druschel/comp413/lectures/rmi-corba.html">Archived</a> 2016-03-04 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a></li>
<li>Farley, Jim. <i><a rel="nofollow" class="external text" href="https://web.archive.org/web/20080222033010/http://www.oreilly.com/catalog/javadc/chapter/ch03.html">Java Distributed Computing</a></i>, O'Reilly, January, 1998.</li>
<li><a rel="nofollow" class="external text" href="http://dsrg.mff.cuni.cz/publications.phtml">Research Papers</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20080212145038/http://dsrg.mff.cuni.cz/publications.phtml">Archived</a> 2008-02-12 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>, Distributed Systems Research Group, Charles University Prague</li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox authority-control" aria-labelledby="Authority_control_databases_frameless&amp;#124;text-top&amp;#124;10px&amp;#124;alt=Edit_this_at_Wikidata&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q5283170#identifiers&amp;#124;class=noprint&amp;#124;Edit_this_at_Wikidata645" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><div id="Authority_control_databases_frameless&amp;#124;text-top&amp;#124;10px&amp;#124;alt=Edit_this_at_Wikidata&amp;#124;link=https&amp;#58;//www.wikidata.org/wiki/Q5283170#identifiers&amp;#124;class=noprint&amp;#124;Edit_this_at_Wikidata645" style="font-size:114%;margin:0 4em">Authority control databases </div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">National</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"><ul><li><span class="uid"><a rel="nofollow" class="external text" href="https://id.loc.gov/authorities/sh98002182">United States</a></span></li><li><span class="uid"><a rel="nofollow" class="external text" href="https://www.nli.org.il/en/authorities/987007563739805171">Israel</a></span></li></ul></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Other</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em"><ul><li><span class="uid"><a rel="nofollow" class="external text" href="https://lux.collections.yale.edu/view/concept/ce1137de-4acd-4688-a922-429f692af81f">Yale LUX</a></span></li></ul></div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-10" href="https://en.wikipedia.org/wiki/?title=Distributed_object_communication&amp;oldid=1289658534">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>